#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import sys
import csv
import django
import random

# 设置Django环境
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Novel.settings')
django.setup()

from background.models import MedicalArticle
from django.db.models import Count

# 推荐系统数据文件
DATA_FILE = "user_article_behavior.csv"

def main():
    """更新推荐系统数据，确保使用数据库中的文章ID"""
    print("正在从数据库获取文章数据...")
    
    # 获取数据库中的所有文章
    articles = MedicalArticle.objects.all()
    
    if not articles.exists():
        print("错误：数据库中没有文章数据，请先导入文章")
        print("可以运行: python background/import_articles.py")
        return
    
    print(f"数据库中共有 {articles.count()} 篇文章:")
    for article in articles:
        print(f"ID: {article.id}, 标题: {article.title}")
    
    # 创建新的用户行为数据文件
    if os.path.exists(DATA_FILE):
        # 备份原文件
        backup_file = f"{DATA_FILE}.bak"
        if os.path.exists(backup_file):
            os.remove(backup_file)
        os.rename(DATA_FILE, backup_file)
        print(f"已备份原数据文件到 {backup_file}")
    
    # 为部分文章创建用户行为数据，保留一些未浏览的文章用于推荐
    article_list = list(articles)
    # 随机选择一半的文章作为已浏览
    viewed_articles = random.sample(article_list, len(article_list) // 2)
    
    with open(DATA_FILE, 'w', newline='', encoding='utf-8') as file:
        writer = csv.writer(file)
        writer.writerow(['user_id', 'article_id', 'favorite_count'])
        
        # 使用文章的实际浏览量和点赞数生成行为数据
        user_id = 1  # 假设用户ID为1
        
        print("\n用户1已浏览的文章:")
        for article in viewed_articles:
            # 用文章的view_count作为收藏/浏览次数，至少为1
            favorite_count = max(1, article.view_count)
            writer.writerow([user_id, article.id, favorite_count])
            
            # 如果点赞数大于0，增加一条权重更高的记录
            if article.like_count > 0:
                writer.writerow([user_id, article.id, article.like_count * 2])
                
            print(f"ID: {article.id}, 标题: {article.title}")
            
        # 未浏览的文章
        unviewed_articles = set(article_list) - set(viewed_articles)
        print("\n用户1未浏览的文章（将被推荐）:")
        for article in unviewed_articles:
            print(f"ID: {article.id}, 标题: {article.title}")
    
    print(f"\n成功创建推荐系统数据文件 {DATA_FILE}，只包含部分已浏览文章")
    print("现在您可以运行推荐系统的分析功能:")
    print("1. 首先运行: python manage.py runserver")
    print("2. 然后执行: curl \"http://localhost:8000/background/article-recommendation/?action=analyze\"")
    print("3. 最后测试推荐: curl \"http://localhost:8000/background/article-recommendation/?action=recommend&user_id=1&top_k=5\"")

if __name__ == "__main__":
    main() 